#
# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
# Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
#
# This file is part of LVM2.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

srcdir = @srcdir@
top_srcdir = @top_srcdir@
top_builddir = @top_builddir@

SOURCES =\
	command.c \
	dumpconfig.c \
	formats.c \
	lvchange.c \
	lvconvert.c \
	lvconvert_poll.c \
	lvcreate.c \
	lvdisplay.c \
	lvextend.c \
	lvmcmdline.c \
	lvmdiskscan.c \
	lvreduce.c \
	lvremove.c \
	lvrename.c \
	lvresize.c \
	lvscan.c \
	polldaemon.c \
	pvchange.c \
	pvck.c \
	pvcreate.c \
	pvdisplay.c \
	pvmove.c \
	pvmove_poll.c \
	pvremove.c \
	pvresize.c \
	pvscan.c \
	reporter.c \
	segtypes.c \
	tags.c \
	toollib.c \
	vgcfgbackup.c \
	vgcfgrestore.c \
	vgchange.c \
	vgck.c \
	vgcreate.c \
	vgconvert.c \
	vgdisplay.c \
	vgexport.c \
	vgextend.c \
	vgimport.c \
	vgmerge.c \
	vgmknodes.c \
	lvpoll.c \
	vgimportclone.c \
	vgreduce.c \
	vgremove.c \
	vgrename.c \
	vgscan.c \
	vgsplit.c

SOURCES2 =\
	dmsetup.c \
	lvm.c \
	lvm2cmd-static.c \
	lvm2cmd.c \
	lvmcmdlib.c \
	man-generator.c

TARGETS =\
	.commands \
	liblvm2cmd.a \
	lvm \
	man-generator

TARGETS_DM = dmsetup

INSTALL_LVM_TARGETS = install_tools_dynamic
INSTALL_DMSETUP_TARGETS = install_dmsetup_dynamic
INSTALL_CMDLIB_TARGETS = install_cmdlib_dynamic install_cmdlib_include 

ifeq ("@STATIC_LINK@", "yes")
  TARGETS += lvm.static
  TARGETS_DM += dmsetup.static
  INSTALL_LVM_TARGETS += install_tools_static
  INSTALL_DMSETUP_TARGETS += install_dmsetup_static
  INSTALL_CMDLIB_TARGETS += install_cmdlib_static
endif

LVMLIBS = $(LVMINTERNAL_LIBS) -ldevmapper -laio
LIB_VERSION = $(LIB_VERSION_LVM)

CLEAN_TARGETS = liblvm2cmd.$(LIB_SUFFIX) $(TARGETS_DM) \
	liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION) lvm-static.o \
	liblvm2cmd-static.a dmsetup.static lvm.static \
	$(LDDEPS) .exported_symbols_generated \
	cmds.h command-lines-input.h command-count.h man-generator.c

ifeq ("@CMDLIB@", "yes")
	TARGETS += liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION)
	INSTALL_LVM_TARGETS += $(INSTALL_CMDLIB_TARGETS)
endif

EXPORTED_HEADER = $(srcdir)/lvm2cmd.h
EXPORTED_FN_PREFIX = lvm2

CFLOW_LIST = lvmcmdlib.c lvm2cmd.c
CFLOW_LIST_TARGET = liblvm2cmd.cflow
CFLOW_TARGET = lvm

include $(top_builddir)/make.tmpl

device-mapper: $(TARGETS_DM)

CFLAGS_dmsetup.o += $(UDEV_CFLAGS) $(EXTRA_EXEC_CFLAGS)

dmsetup: dmsetup.o $(top_builddir)/libdm/libdevmapper.$(LIB_SUFFIX)
	@echo "    [CC] $@"
	$(Q) $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) \
	      -o $@ dmsetup.o -ldevmapper $(LIBS)

dmsetup.static: dmsetup.o $(interfacebuilddir)/libdevmapper.a
	@echo "    [CC] $@"
	$(Q) $(CC) $(CFLAGS) $(LDFLAGS) -static -L$(interfacebuilddir) \
	      -o $@ dmsetup.o -ldevmapper $(M_LIBS) $(PTHREAD_LIBS) $(STATIC_LIBS) $(LIBS)

all: device-mapper

CFLAGS_lvm.o += $(EXTRA_EXEC_CFLAGS)

INCLUDES += -I$(top_builddir)/tools

lvm: $(OBJECTS) lvm.o $(top_builddir)/lib/liblvm-internal.a
	@echo "    [CC] $@"
	$(Q) $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) -o $@ $(OBJECTS) lvm.o \
		$(LVMLIBS) $(READLINE_LIBS) $(LIBS)

DEFS_man-generator.o += -DMAN_PAGE_GENERATOR

man-generator.c: command.c
	@echo "    [LN] $@"
	$(Q) $(LN_S) -f $< $@

man-generator: man-generator.o
	@echo "    [CC] $@"
	$(CC) $(CFLAGS) -o $@ $<

ifeq ("@BUILD_LVMETAD@", "yes")
lvm: $(top_builddir)/libdaemon/client/libdaemonclient.a
endif

lvm.static: $(OBJECTS) lvm-static.o $(top_builddir)/lib/liblvm-internal.a  $(interfacebuilddir)/libdevmapper.a
	@echo "    [CC] $@"
	$(Q) $(CC) $(CFLAGS) $(LDFLAGS) -static -L$(interfacebuilddir) -o $@ \
	      $(OBJECTS) lvm-static.o $(LVMLIBS) $(STATIC_LIBS) $(LIBS)

liblvm2cmd.a: $(top_builddir)/lib/liblvm-internal.a $(OBJECTS) lvmcmdlib.o lvm2cmd.o
	@echo "    [AR] $@"
	$(Q) cat $(top_builddir)/lib/liblvm-internal.a > $@
	$(Q) $(AR) rs $@ $(OBJECTS) lvmcmdlib.o lvm2cmd.o > /dev/null

liblvm2cmd-static.a: $(top_builddir)/lib/liblvm-internal.a $(OBJECTS) lvmcmdlib.o lvm2cmd-static.o
	@echo "    [AR] $@"
	$(Q) cat $(top_builddir)/lib/liblvm-internal.a > $@
	$(Q) $(AR) rs $@ $(OBJECTS) lvmcmdlib.o lvm2cmd-static.o > /dev/null

liblvm2cmd.$(LIB_SUFFIX): liblvm2cmd.a $(LDDEPS)
	@echo "    [CC] $@"
	$(Q) $(CC) -shared -Wl,-soname,$@.$(LIB_VERSION) \
		$(CFLAGS) $(CLDFLAGS) -o $@ \
		@CLDWHOLEARCHIVE@ liblvm2cmd.a @CLDNOWHOLEARCHIVE@ \
		$(LVMLIBS) $(LIBS)

liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION): liblvm2cmd.$(LIB_SUFFIX)
	@echo "    [LN] $@"
	$(Q) $(LN_S) -f $< $@

.commands: $(srcdir)/commands.h $(srcdir)/cmdnames.h Makefile
	@echo "    [CC] $<"
	$(Q) $(CC) -E -P $(srcdir)/cmdnames.h 2> /dev/null | \
		$(EGREP) -v '^ *(|#.*|config|devtypes|dumpconfig|formats|fullreport|help|lastlog|lvmchange|lvpoll|pvdata|segtypes|systemid|tags|version) *$$' > .commands

command-count.h: $(srcdir)/command-lines.in Makefile
	@echo "    [GEN] $@"
	$(Q) set -o pipefail && \
	( cat $(top_srcdir)/tools/license.inc && \
	  echo "/* Do not edit. This file is generated by the Makefile. */" && \
	  echo -n "#define COMMAND_COUNT " && \
	  $(GREP) '^ID:' $(srcdir)/command-lines.in | $(WC) -l \
	) > $@

cmds.h: $(srcdir)/command-lines.in Makefile
	@echo "    [GEN] $@"
	$(Q) set -o pipefail && \
	( cat $(top_srcdir)/tools/license.inc && \
	  echo "/* Do not edit. This file is generated by the Makefile. */" && \
	  echo "cmd(CMD_NONE, none)" && \
	  $(GREP) '^ID:' $(srcdir)/command-lines.in | $(SORT) -u | $(AWK) '{print "cmd(" $$2 "_CMD, " $$2 ")"}' && \
	  echo "cmd(CMD_COUNT, count)" \
	) > $@

command-lines-input.h: $(srcdir)/command-lines.in Makefile
	@echo "    [GEN] $@"
	$(Q) set -o pipefail && \
	( cat $(top_srcdir)/tools/license.inc && \
	  echo "/* Do not edit. This file is generated by the Makefile. */" && \
	  echo -en "const char _command_input[] =\n\n\"" && \
	  $(EGREP) -v '^#|\-\-\-|^$$' $(srcdir)/command-lines.in | $(AWK) 'BEGIN {ORS = "\\n\"\n\""} //' && \
	  echo "\\n\";" \
	) > $@

$(SOURCES:%.c=%.d) $(SOURCES2:%.c=%.d): command-lines-input.h command-count.h cmds.h
$(SOURCES:%.c=%.o) $(SOURCES2:%.c=%.o): command-lines-input.h command-count.h cmds.h

ifneq ("$(CFLOW_CMD)", "")
CFLOW_SOURCES = $(addprefix $(srcdir)/, $(SOURCES))
-include $(top_builddir)/libdm/libdevmapper.cflow
-include $(top_builddir)/lib/liblvm-internal.cflow
endif

.PHONY: install_cmdlib_dynamic install_cmdlib_static install_cmdlib_include \
	install_tools_dynamic install_tools_static \
	install_dmsetup_dynamic install_dmsetup_static

install_cmdlib_include: $(srcdir)/lvm2cmd.h
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_DATA) -D $< $(includedir)/$(<F)

install_cmdlib_dynamic: liblvm2cmd.$(LIB_SUFFIX)
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_PROGRAM) -D $< $(libdir)/$(<F).$(LIB_VERSION)
	$(Q) $(INSTALL_DIR) $(usrlibdir)
	$(Q) $(LN_S) -f $(USRLIB_RELPATH)$(<F).$(LIB_VERSION) $(usrlibdir)/$(<F)

install_cmdlib_static: liblvm2cmd-static.a
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_DATA) -D $< $(usrlibdir)/liblvm2cmd.a

install_tools_dynamic: lvm .commands
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_PROGRAM) -D lvm $(sbindir)/lvm
	@echo Creating symbolic links for individual commands in $(sbindir)
	@for v in `cat .commands`; do \
		echo "$(LN_S) -f lvm $(sbindir)/$$v"; \
		$(LN_S) -f lvm $(sbindir)/$$v; \
	done;

install_tools_static: lvm.static
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_PROGRAM) -D $< $(staticdir)/$(<F)

install_dmsetup_dynamic: dmsetup
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_PROGRAM) -D $< $(sbindir)/$(<F)
	$(Q) $(LN_S) -f $(<F) $(sbindir)/dmstats

install_dmsetup_static: dmsetup.static
	@echo "    [INSTALL] $<"
	$(Q) $(INSTALL_PROGRAM) -D $< $(staticdir)/$(<F)
	$(Q) $(LN_S) -f $(<F) $(staticdir)/dmstats

install_device-mapper: $(INSTALL_DMSETUP_TARGETS)

install_lvm2: $(INSTALL_LVM_TARGETS)

install: install_lvm2 install_device-mapper
